/*
 * FaceCat图形通讯框架
 * 著作权编号:2015SR229355+2020SR0266727
 * 上海卷卷猫信息技术有限公司
 */

#ifdef __FCNATIVE_H__
#else                                                                            
#define __FCNATIVE_H__
#endif
#pragma once
#include "../../stdafx.h"
#include "FCView.h"
#include "FCTran.h"
#include "FCPaint.h"
#include "FCHost.h"

namespace FaceCat{
    enum SortType{
		SortType_None,
		SortType_Asc,
		SortType_Desc
	};

	class FCView;
	class FCHost;
	class WinHost;
	/*
	* 控制器
	*/
    class FCNative{
	public:
	    /**
		 * 是否允许使用缩放尺寸
		 */
		bool m_allowScaleSize;
		/*
		* 开始绘图的店
		*/
		FCPoint m_drawBeginPoint;
		/**
		 * 拖动开始时的区域
		 */
		FCRect m_dragBeginRect;
		/**
		 * 可以开始拖动的偏移坐标量
		 */
		FCPoint m_dragStartOffset;
		/*
		* 要导出图片的视图
		*/
		FCView *m_exportingView;
		/**
		 * 视图管理器
		 */
		FCHost *m_host;
		/*
		* 是否锁定更新
		*/
		bool m_lockUpdate;
		/**
		 * 透明度
		 */
		float m_opacity;
		/**
		 * 绘图类
		 */
		FCPaint *m_paint;
		/**
		 * 触摸按下时的坐标
		 */
		FCPoint m_touchDownPoint;
		/**
		 * 资源文件的路径
		 */
		String m_resourcePath;
		/**
		 * 旋转角度
		 */
		int m_rotateAngle;
		/**
		 * 使用缩放尺寸
		 */
		FCSize m_scaleSize;
		/**
		 * 显示区域
		 */
		FCSize m_size;
		/*
		* 秒表
		*/
		HashMap<int, FCView*> m_timers;
	    /**
         * 根据触摸位置获取视图
         * @param mp    坐标
         * @param view 视图
         * @returns 视图对象
        */
		virtual FCView* findView(const FCPoint& mp, ArrayList<FCView*> *views);
	    /**
         * 根据名称查找视图
         * @param name  名称
         * @param views  视图集合
         * @returns 视图
        */
		virtual FCView* findView(const String& name, ArrayList<FCView*> *views);
	    /**
         * 根据视图查找预处理事件的视图
         * @param view   视图
         * @returns 视图
        */
		virtual FCView* findPreviewsView(FCView *view);
	    /**
         * 根据视图查找窗体
         * @param view   视图
         * @returns 窗体
        */
		virtual FCView* findWindow(FCView *view);
	    /**
         * 获取绘制的透明度
         * @param view   视图
         * @returns 透明度
        */
		virtual float getPaintingOpacity(FCView *view);
	    /**
         * 获取排序后的视图集合
         * @param parent    父视图
         * @param sortedViews   排序后的视图
         * @returns 状态
        */
		virtual bool getSortedViews(FCView *parent, ArrayList<FCView*> *sortedViews);
		/*
		* 获取允许Tab键的视图
		*/
		virtual void getTabStopViews(FCView *view, ArrayList<FCView*> *tabStopViews);
	    /**
         * 判断是否绘制可用状态
         * @param view   视图
         * @returns 是否绘制可用状态
        */
		virtual bool isPaintEnabled(FCView *view);
	    /**
         * 绘制视图
         * @param   rect 矩形
         * @param   views 视图集合
         * @param   opacity 透明度
        */
		virtual void renderViews(const FCRect& rect, ArrayList<FCView*> *views, float opacity);
		 /**
         * 绘制视图
         * @param   rect 矩形
         * @param   views 视图集合
         * @param   opacity 透明度
        */
		virtual void renderView(const FCRect& rect, FCView *views, float opacity);
		/*
		* 设置光标
		*/
		virtual void setCursor(FCView *view);
	    /**
         * 设置绘图属性
         * @param offsetX  横向偏移
         * @param offsetY  纵向偏移
         * @param clipRect  裁剪区域
         * @param resourcePath  资源路径
         * @param opacity  透明度
        */
		virtual void setPaint(int offsetX, int offsetY, const FCRect& clipRect, float opacity);
	public:
	    /**
		 * 正被拖动的视图
		 */
		FCView *m_draggingView;
		/*
		* 正被焦点的视图
		*/
		FCView *m_focusedView;
		/**
		 * 正被触摸按下的视图
		 */
		FCView *m_touchDownView;
		/**
		 * 触摸正在其上方移动的视图
		 */
		FCView *m_touchMoveView;
	public:
	    /**
		 * 视图
		 */
		ArrayList<FCView*> m_views;
		/*
		* 构造函数
		*/
		FCNative();
		/*
		* 析构函数
		*/
		virtual ~FCNative();
		/**
		 * 获取是否允许使用缩放尺寸
		 */
		virtual bool allowScaleSize();
		/**
		 * 设置是否允许使用缩放尺寸
		 */
		virtual void setAllowScaleSize(bool value);
		/*
		* 获取鼠标的形状
		*/
		virtual FCCursors getCursor();
		/*
		* 设置鼠标的形状
		*/
		void setCursor(FCCursors value);
		/**
		 * 获取选中的视图
		 */
		FCView* getFocusedView();
		/**
		 * 设置选中的视图
		 */
		virtual void setFocusedView(FCView *value);
		/**
		 * 获取视图管理器
		 */
		virtual FCHost* getHost();
		/**
		 * 设置视图管理器
		 */
		virtual void setHost(FCHost *value);
		/**
		 * 获取触摸悬停的视图
		 */
		virtual FCView* getHoveredView();
		/**
		 * 获取触摸的实际位置
		 */
		virtual FCPoint getTouchPoint();
		/**
		 * 获取透明度
		 */
		virtual float getOpacity();
		/**
		 * 设置透明度
		 */
		virtual void setOpacity(float value);
		/**
		 * 获绘图类
		 */
		virtual FCPaint* getPaint();
		/**
		 * 取绘图类
		 */
		virtual void setPaint(FCPaint *value);
		/**
		 * 获取触摸按住的视图
		 */
		virtual FCView* getPushedView();
		/**
		 * 获取资源文件的路径
		 */
		virtual String getResourcePath();
		/**
		 * 设置资源文件的路径
		 */
		virtual void setResourcePath(const String& value);
		/**
		 * 获取旋转角度
		 */
		virtual int getRotateAngle();
		/**
		 * 设置旋转角度
		 */
		virtual void setRotateAngle(int value);
		/**
		 * 获取使用缩放尺寸
		 */
		virtual FCSize getScaleSize();
		/**
		 * 设置使用缩放尺寸
		 */
		void setScaleSize(FCSize value);
		/**
		 * 获取显示区域
		 */
		virtual FCSize getSize();
		/**
		 * 设置显示区域
		 */
		virtual void setSize(FCSize value);
	public:
	    /**
         * 添加视图
         * @param view 视图
        */
		virtual void addView(FCView *view);
	    /**
         * 将视图放到最前显示
         * @param view 视图
        */
		virtual void bringToFront(FCView *view);
		/**
		 * 退出拖动
		 */
		virtual void cancelDragging();
		/**
		 * 清除所有的视图
		 */
		virtual void clearViews();
		/*
         * 清除视图的状态
         */
        void clearViewState(FCView *view);
	    /**
         * 获取视图的绝对横坐标
         * @param view 视图
        */
		virtual int clientX(FCView *view);
	    /**
         * 获取视图的绝对纵坐标
         * @param view 视图
         * @returns 坐标
        */
		virtual int clientY(FCView *view);
		/*
         * 获取控件的绝对坐标
         */
        virtual FCPoint clientPoint(FCView *view);
	    /**
         * 是否包含视图
         * @param view 视图
         * @returns 是否包含
        */
		virtual bool containsView(FCView *view);
		/*
		* 导出为图片
		*/
        virtual void exportToImage(const String& exportPath);
		/*
		* 导出为图片
		*/
        virtual void exportToImage(const String& exportPath, FCView *view);
        /**
         * 根据触摸位置获取视图
         * @param mp    坐标
        */
		virtual FCView* findView(const FCPoint& mp);
	    /**
         * 根据坐标在视图中查找视图
         * @param mp    坐标
         * @param parent    父视图
         * @returns 视图
        */
		virtual FCView* findView(const FCPoint& mp, FCView *parent);
	    /**
         * 根据名称查找视图
         * @param name  名称
         * @returns 视图
        */
		virtual FCView* findView(const String& name);
		/**
		 * 获取视图集合的拷贝
		 */
		virtual ArrayList<FCView*> getViews();
	    /**
         * 插入视图
         * @param index 索引
         * @param view   视图
         */
		virtual void insertView(int index, FCView *view);
		/**
		 * 使用缓存绘制图象，不重新计算绘图结构
		 */
		virtual void invalidate();
	    /**
         * 局部绘图
         * @param view   视图
         */
		virtual void invalidate(FCView *view);
	    /**
         * 局部绘图
         * @param rect  区域
         */
		virtual void invalidate(const FCRect& rect);
		/**
         * 文字输入
         */
		virtual bool onChar(wchar_t key);
	    /**
         * 双击
         */
		virtual void onDoubleClick(FCTouchInfo touchInfo);
		/**
         * 键盘按下
         */
		virtual void onKeyDown(char key);
		/**
         * 键盘抬起
         */
		virtual void onKeyUp(char key);
		/**
         * 触摸按下
         */
		virtual void onTouchDown(FCTouchInfo touchInfo);
		/**
         * 触摸离开
         */
		virtual void onTouchLeave(FCTouchInfo touchInfo);
	    /**
         * 触摸移动事件
         * @param   ouchInfo    触摸信息
        */
		virtual void onTouchMove(FCTouchInfo touchInfo);
		/**
         * 触摸抬起
         */
		virtual void onTouchUp(FCTouchInfo touchInfo);
		/**
         * 触摸滚动
         */
		virtual void onTouchWheel(FCTouchInfo touchInfo);
	    /**
         * 绘图方法
         * @param clipRect  矩形区域
        */
		virtual void onPaint(const FCRect& rect);
		/*
		* 按键预处理
		*/
		virtual bool onPreviewsKeyEvent(String eventName, char key);
		/*
		* 触摸预处理
		*/
		virtual bool onPreviewsTouchEvent(String eventName, FCView *view, FCTouchInfo touchInfo);
		/**
		 * 处理尺寸改变
		 */
		virtual void onResize();
		/*
		* 处理缩放
		*/
		virtual void onScaling(double scaleFactorX, double scaleFactorY);
	    /**
         * 处理秒表
         * @param   timerID 秒表ID
        */
		virtual void onTimer(int timerID);
		/**
		 * 移除视图
		 */
		virtual void removeView(FCView *view);
		/**
		 * 将视图放到最下面显示
		 */
		virtual void sendToBack(FCView *view);
		/**
		 * 设置排列
		 */
		virtual void setAlign(ArrayList<FCView*> *views);
		/*
		* 设置锚定信息
		*/
		virtual void setAnchor(ArrayList<FCView*> *views, FCSize oldSize);
		/*
		* 设置绑定边缘
		*/
		virtual void setDock(ArrayList<FCView*> *views);
	    /**
         * 启动秒表
         * @param view  视图
         * @param timerID  秒表编号
         * @param interval 间隔
        */
		virtual void startTimer(FCView *view, int timerID, int interval);
		/**
		 * 停止秒表
		 */
		virtual void stopTimer(int timerID);
		/**
		 * 更新布局
		 */
		virtual void update();
	public:
        static void addChangeID();
        static int getChangeID();

	};
}
